package com.itheima.thread.pool.demo01;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 线程池的类
 */
public class ThreadPool {

    // 指定初始化线程的个数
    private int poolSize = 2 ;

    // 定义任务容器，这个容器是一个任务容器，因此这个容器中所存储的元素就是任务，而要被线程执行的任务，可以通过Runnable这个接口进行封装
    private BlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<Runnable>() ;

    // 提供构造方法
    public ThreadPool() {

        // 创建两个线程对象，并将其启动起来
        for(int x = 0 ; x < poolSize ; x++) {
            new TaskThread("线程---->" + x).start();
        }

    }

    // 提供一个方法(submit)向任务容器中添加任务
    public void submit(Runnable runnable) {
        try {
            blockingQueue.put(runnable);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    // 使用内部类的方式去定义一个线程类
    public class TaskThread extends Thread {

        public TaskThread(String name) {            // 这个构造方法的作用就是用来执行线程名称
            super(name);
        }

        @Override
        public void run() {

            // 从阻塞队列中获取不断的获取任务去执行
            while(true) {

                try {

                    Runnable runnable = blockingQueue.take();
                    runnable.run();

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }

        }
    }

}
